import java.lang.*;
import java.util.*;

public class CreateThread extends Thread
{
	private static Semaphore G1, G2, G3, G4, G5;		
	private static Storage myStorage;	
	private static DataCollection Data;
	private static Random rand0;
	private static System mySystem;
	
	
	public CreateThread(Semaphore gg1, Semaphore gg2, Semaphore gg3, Semaphore gg4, Semaphore gg5, Storage sto, DataCollection d, Random rand)
	{
		G1 = gg1;
		G2 = gg2;
		G3 = gg3;
		G4 = gg4;
		G5 = gg5;
		myStorage = sto;
		Data = d;
		rand0 = rand;
		
	}
	
	
	private static void interval()
	{
		double intervalTime = 200-100+2*100*rand0.nextFloat(); /* 0.2+-0.1 hour */
		try
		{
			sleep((long)intervalTime);			
		}
		catch (InterruptedException e)
		{
			System.out.println(e);
		}
	}



	public void run()
	{
		
		long startTime = 0;
		long endTime = 0;
		float jobType;
		TypeA type1;
		TypeB type2;
		TypeC type3;
				
		startTime = mySystem.currentTimeMillis();
		for (int i=1; i<=8; i++)
		{
			jobType = rand0.nextFloat();
			if (jobType<0.5)
			{
				type1 = new TypeA(G3, G1, G2, G5, myStorage, Data);
				type1.start();
			}
			else if ((jobType>=0.5)&&(jobType<0.8))
			{
				type2 = new TypeB(G4, G1, G3, myStorage, Data);
				type2.start();
			}
			else
			{
				type3 = new TypeC(G2, G5, G1, G4, G3, myStorage, Data);
				type3.start();
			}
		}
			
		endTime = mySystem.currentTimeMillis();
		
		while ((endTime - startTime)<=200000)
		{
			jobType = rand0.nextFloat();
			if (jobType<0.5)
			{
				type1 = new TypeA(G3, G1, G2, G5, myStorage, Data);
				type1.start();
			}
			else if ((jobType>=0.5)&&(jobType<0.8))
			{
				type2 = new TypeB(G4, G1, G3, myStorage, Data);
				type2.start();
			}
			else
			{
				type3 = new TypeC(G2, G5, G1, G4, G3, myStorage, Data);
				type3.start();
			}
			
			interval();
			
			endTime = mySystem.currentTimeMillis();
		}
		
		System.out.println("Simulation time is over..." );
		System.out.println(" " );
		System.out.println("------------------------- Simulation Results -------------------------" );
		System.out.println(" " );
		Data.Report();
		System.out.println(" " );
		System.out.println("Simulation is successful!!!" );
		
	}
	
}
			
			
			
			
			
		
		

